#include <iostream>
using namespace std;

int X = 1; // 变量、函数、枚举成员在同一个命名“环境”
// char X; // 错误
// void X() {}
// enum {X};

class X {}; // 可以。类、结构体、枚举在另一个环境。
// struct X {}; // 错误：类环境现在也重名了
// enum X {};
// union X {};

int main() {
X:                   // 可以，标号又是个独立的命名环境
  cout << X << endl; // 1
  int X = 2;         // 可以。local域遮盖了外部同名变量
  cout << X << endl; // 2
  {
    int X = 3;         // 可以。这种特性和Java不同。
    cout << X << endl; // 3
  }
  cout << X << endl; // 2
}
/*
C++除了namespace，内部还有几种命名的“环境”。
*/